package com.lazycat.leetcode.editor.cn;
//2023-06-18 19:06:17
//二维矩阵 grid 由 0 （土地）和 1 （水）组成。岛是由最大的4个方向连通的 0 组成的群，封闭岛是一个 完全 由1包围（左、上、右、下）的岛。 
//
// 请返回 封闭岛屿 的数目。 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入：grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,
//0,1],[1,1,1,1,1,1,1,0]]
//输出：2
//解释：
//灰色区域的岛屿是封闭岛屿，因为这座岛屿完全被水域包围（即被 1 区域包围）。 
//
// 示例 2： 
//
// 
//
// 
//输入：grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
//输出：1
// 
//
// 示例 3： 
//
// 
//输入：grid = [[1,1,1,1,1,1,1],
//             [1,0,0,0,0,0,1],
//             [1,0,1,1,1,0,1],
//             [1,0,1,0,1,0,1],
//             [1,0,1,1,1,0,1],
//             [1,0,0,0,0,0,1],
//             [1,1,1,1,1,1,1]]
//输出：2
// 
//
// 
//
// 提示： 
//
// 
// 1 <= grid.length, grid[0].length <= 100 
// 0 <= grid[i][j] <=1 
// 
//
// Related Topics 深度优先搜索 广度优先搜索 并查集 数组 矩阵 👍 228 👎 0

class NumberOfClosedIslands {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new NumberOfClosedIslands().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    int[][] dirs = new int[][]{{0,-1},{0,1},{-1,0},{1,0}};
    public int closedIsland(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;

        if(m < 3 || n< 3){
            return 0;
        }

        for (int i = 0;i<m;i++){
            int step = i == 0 || i == m-1 ? 1 : n-1;
            for(int j = 0;j<n;j+= step){
                dfs(grid,i,j);
            }
        }

        int ans = 0;
        for(int i = 1;i<m-1;i++){
            for(int j = 1;j<n-1;j++){
                if(grid[i][j] == 0){
                    ans++;
                    dfs(grid,i,j);
                }
            }
        }

        return ans;
    }

    private void dfs(int[][] grid,int x,int y){
        if(x<0 || x>=grid.length || y< 0 || y>= grid[0].length || grid[x][y] != 0){
            return;
        }
        grid[x][y] = 1;
        for(int[] dir : dirs){
            dfs(grid, x+dir[0], y+dir[1]);
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}